package fr.afcepf.atod18.fw.parser;

import java.io.IOException;
import java.net.URL;
import java.util.List;

import net.htmlparser.jericho.Element;
import net.htmlparser.jericho.Source;

public class FormGenerator {

	String provenance;
	String packageName = "fr.afcepf.atod18.fw.form";
	String interfaceActionForm = "IActionForm";

	public String genForm(String provenance) {
		// fabrication du nom de la jsp actuelle
		String jspFileName = provenance.substring(1, provenance.length()).replace("Action.perform","")
				+ ".jsp";
		String jspFileUrl = "../../pages/" + jspFileName;
		String jspSource = Thread.currentThread().getContextClassLoader().getResource(jspFileUrl)
				.getPath();

		String sourceUrlString = "file:" + jspSource;
		// source est initialisée avec le fichier jsp à analyser
		Source source = null;
		try {
			source = new Source(new URL(sourceUrlString));
		} catch (IOException e) {
			e.printStackTrace();
		}
		// fabrication du nom du pojo Form correspondant 
		String nomClasse = provenance.substring(1, provenance.length()).replace("Action.perform","")
				+ "Form";
		// fabrication du contenu du pojo Form
		StringBuffer formFile = new StringBuffer();
		// 1. ligne package
		formFile.append(lignePackage(packageName));
		formFile.append("\n");
		// 2. ligne déclaration de la classe
		formFile.append(ligneClasse(nomClasse));
		formFile.append("\n");

		// 3. toutes les lignes des attributs
		List<Element> elements = source.getAllElements("input");
		for (int i = 0; i < elements.size() - 1; i++) {
			if (elements.get(i) != null) {
				if (!elements.get(i).getAttributeValue("name").equals("null")) {
					String name = elements.get(i).getAttributeValue("name");
					String htmlType = elements.get(i).getAttributeValue("type");
					System.out.println("name=" + name + " type=" + htmlType);
					formFile.append(ligneAttribut(htmlType, name));
				}
			}
		}
		formFile.append("\n");
		// 4. méthode validateForm
		formFile.append(ligneOverride());
		formFile.append(ligneValidateForm());
		formFile.append("\n");

		// 5. tous les getter et setter
		for (int i = 0; i < elements.size() - 1; i++) {
			if (elements.get(i) != null) {
				if (!elements.get(i).getAttributeValue("name").equals("null")) {
					String name = elements.get(i).getAttributeValue("name");
					String htmlType = elements.get(i).getAttributeValue("type");
					formFile.append(ligneGetAttribut(htmlType, name));
					formFile.append(ligneSetAttribut(htmlType, name));
				}
			}
		}
		System.out.println("\n==================================> Début Fichier java généré <==");
		System.out.println(formFile);
		System.out.println("==================================> Fin Fichier java généré <==\n");
		return formFile.toString();
	}

	private String lignePackage(String packageName) {
		return "package " + packageName + ";" + "\n";
	}

	private String ligneClasse(String nomClasse) {
		return "public class " + nomClasse.substring(0, 1).toUpperCase()
				+ nomClasse.substring(1, nomClasse.length()) + " implements " + interfaceActionForm + " {\n";
	}

	private String ligneAttribut(String htmlType, String nomAttribut) {
		return "private " + htmlType2JavaType(htmlType) + " " + nomAttribut + ";\n";
	}
	private String ligneOverride() {
		return "@Override\n";
	}
	private String ligneValidateForm() {
		return "public boolean validateForm() {\nreturn true;\n}\n";
	}
	private String htmlType2JavaType(String htmlType) {
		htmlType = htmlType.toUpperCase();
		String javaType = null;
		if (htmlType.equals("TEXT")) {
			javaType = "String";
		} else if (htmlType.equals("NUMBER")) {
			javaType = "int";
		} else {
			javaType = "String";
		}
		return javaType;
	}
	private String ligneGetAttribut(String htmlType, String nomAttribut) {
		return "public get" + nomAttribut.substring(0, 1).toUpperCase()
				+ nomAttribut.substring(1, nomAttribut.length()) + "() {\n"
				+ "return " + nomAttribut + ";\n"
				+ "}\n";
	}
	private String ligneSetAttribut(String htmlType, String nomAttribut) {
		return "public set" + nomAttribut.substring(0, 1).toUpperCase()
				+ nomAttribut.substring(1, nomAttribut.length()) + "(" + htmlType2JavaType(htmlType) + " "
				+ nomAttribut + ") {\n" + "this." + nomAttribut + " = " + nomAttribut + ";\n" + "}\n";
	}

	/**
	 * @return le provenance
	 */
	public String getProvenance() {
		return provenance;
	}

	/**
	 * @param provenance
	 *            le provenance à définir
	 */
	public void setProvenance(String provenance) {
		this.provenance = provenance;
	}

	/**
	 * @return le packageName
	 */
	public String getPackageName() {
		return packageName;
	}

	/**
	 * @param packageName
	 *            le packageName à définir
	 */
	public void setPackageName(String packageName) {
		this.packageName = packageName;
	}

	/**
	 * @return le interfaceActionForm
	 */
	public String getInterfaceActionForm() {
		return interfaceActionForm;
	}

	/**
	 * @param interfaceActionForm
	 *            le interfaceActionForm à définir
	 */
	public void setInterfaceActionForm(String interfaceActionForm) {
		this.interfaceActionForm = interfaceActionForm;
	}
}
